package thread.ch03;

/**
 * 可能会输出42，也可能输出0，也可能根本不会终止<br />
 * 重排序<br />
 * 在没有同步的情况下，编译器，处理器，运行时安排操作的执行顺序可能完全出人意料。在没有进行适当同步的多线程程序中，尝试推断那些“必然”发生在内存中的动作时，
 * 你总是会判断错误<br />
 * 过期数据<br />
 * 当读线程检查ready变量时，它可能看到一个过期的值。除非每次访问变量都是同步的，否则很可能得到变量的过期值。更坏的情况是，过期既不会发生在全部变量上，
 * 也不会完全不出现：一个线程可能会得到一个变量最新的值，但是也可能得到另一个变量先前写入的过期值。
 * 
 * @author Edgar Zhang
 * 
 */
public class NoVisibility {

	private static boolean ready;
	private static int number;

	private static class ReadThread extends Thread {
		@Override
		public void run() {
			while (!ready) {
				Thread.yield();
			}
			System.out.println(number);
		}
	}

	public static void main(String[] args) {
		new ReadThread().start();
		number = 42;
		ready = true;
	}
}
